#ifndef CAMERA_H_
#define CAMERA_H_

//-----------------------------------------------------------------
// Includes
//-----------------------------------------------------------------
#include <string>
#include "../Tools/Exceptions.hpp"
#include <opencv/cxcore.h>
#include <opencv/highgui.h>
#include <opencv/cvaux.h>

namespace Vision
{
	//-----------------------------------------------------------------
    // Cette classe décrit l'ensemble des fonctionnalités offerte par 
    // une caméra
	//-----------------------------------------------------------------
	class Camera
	{
	public:
		//-------------------------------------------------------------
		// Constructeur
		//-------------------------------------------------------------
		Camera( std::string identifier, int cameraIndex ) throw (Tools::InvalidDevice);
		
		//-------------------------------------------------------------
		// Constructeur
		//-------------------------------------------------------------
		Camera( std::string identifier );

		//-------------------------------------------------------------
		// Destructeur
		//-------------------------------------------------------------
		virtual ~Camera();
		
		//-------------------------------------------------------------
		// Retourne l'idenfiant de la caméra
		//-------------------------------------------------------------
		std::string GetIdentifier();
	
		//-------------------------------------------------------------
		// Prise d'une image depuis la camera
		//-------------------------------------------------------------
		IplImage* CapturePicture();
		
		//-------------------------------------------------------------
		// Désactice le lien avec la caméra
		//-------------------------------------------------------------
		void Disconnect(); 
		
		//-------------------------------------------------------------
		// Affecte l'identifiant de la caméra
		//-------------------------------------------------------------
		void SetIdentifier(const std::string & identifier );
		
		//-------------------------------------------------------------
		// Affecte les paramètres de calibrage de la caméra 
		//-------------------------------------------------------------
		void SetCameraCalibrationParameter(CvMat* intrinsecParameters, CvMat* distortionCoefficients);
		
		//-------------------------------------------------------------
		// Affecte les paramètres de positionnement de la caméra 
		//-------------------------------------------------------------
		void SetCameraPosition( const Cv3dTrackerCameraInfo & informations);
		
		//-------------------------------------------------------------
		// Retourne la distance focale de la caméra
		//-------------------------------------------------------------
		float* GetFocalLength();
		
		//-------------------------------------------------------------
		// Retourne les coordonnées du point principal
		//-------------------------------------------------------------
		float* GetPrincipalPoint();
		
		//-------------------------------------------------------------
		// Retourne les coefficients de distosion de la caméra
		//-------------------------------------------------------------
		float* GetDistortionCoefficients();
		
		//-------------------------------------------------------------
		// Retourne les informations sur la position de la caméra
		//-------------------------------------------------------------
		Cv3dTrackerCameraInfo* GetCameraPosition();
		
	private:
		//-------------------------------------------------------------
		// Constructeur par copie et opérateur d'affectation 
		// -> en privée pour empecher l'affectation 
		//-------------------------------------------------------------
		Camera( const Camera & copy);
		Camera& operator=( const Camera & copy);
		
		//-------------------------------------------------------------
		// Attributs
		//-------------------------------------------------------------
		
		// Identifiant de la caméra
		std::string cameraIdentifier;
		
		// Device de la caméra
		CvCapture* cameraDevice;
		
		// Coordonné du point principal [1x2]
		float cameraPrincipalPoint[2];
		
		// Taille de la focale [1x2]
		float cameraFocalLength[2];		
		
		// Coefficient de distorsion [1x4]
		float cameraDistortionCoefficients[4]; 
		
		//Information de positionnement de la caméra
		Cv3dTrackerCameraInfo cameraInformations;
	};

}

#endif /*CAMERA_H_*/
